home *** CD-ROM | disk | FTP | other *** search
/ Multimedia Jumpstart / Multimedia Microsoft Jumpstart Version 1.1a (Microsoft).BIN / develpmt / source / triq / 4d / transfor.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-12  |  6.0 KB  |  259 lines

  1. #include <windows.h>
  2. #include "4d.h"
  3.  
  4. /*
  5.      (C) Copyright Microsoft Corp. 1991.  All rights reserved.
  6.  
  7.      You have a royalty-free right to use, modify, reproduce and 
  8.      distribute the Sample Files (and/or any modified version) in 
  9.      any way you find useful, provided that you agree that 
  10.      Microsoft has no warranty obligations or liability for any 
  11.      Sample Application Files which are modified. 
  12.  */
  13.  
  14. #define PI        3.1415926535897931216823
  15. #define FXPI        205887
  16.  
  17. #define fDebug 0
  18. /* extern int fDebug; */
  19. TRANSFORM *CTM;    /* global, current transform */
  20.  
  21. int vAppendTransform (TRANSFORM *T,void *arg);
  22.  
  23. /*-----------------------------------------------------------------------------
  24. -----------------------------------------------------------------------------*/
  25. TRANSFORM *NewTransform()
  26. {
  27.     TRANSFORM *pT;
  28.  
  29.     pT = (TRANSFORM *)LocalAlloc (LPTR, sizeof(TRANSFORM));
  30.     InitTransform (pT);
  31.     return pT;
  32. }
  33.  
  34. /*-----------------------------------------------------------------------------
  35. -----------------------------------------------------------------------------*/
  36. TRANSFORM *MakeTM(a)
  37. {
  38.     TRANSFORM *pT;
  39.  
  40.     pT = NewTransform();
  41.     if (pT != NULL) {
  42.        vAppendTransform (pT,&a);
  43.     }
  44.     return pT;
  45. }
  46.  
  47. /*-----------------------------------------------------------------------------
  48. -----------------------------------------------------------------------------*/
  49. int FreeTransform (pT)
  50.     TRANSFORM *pT;
  51. {
  52.     LocalUnlock((HANDLE)pT);
  53.     LocalFree((HANDLE)pT);
  54.     return 1;
  55. }
  56.  
  57. /*-----------------------------------------------------------------------------
  58. -----------------------------------------------------------------------------*/
  59.  
  60. int AppendTransform (T,...)
  61.     TRANSFORM *T;
  62. {
  63.     return vAppendTransform (T,(&T) + 1);
  64. }
  65.  
  66.  
  67. /*-----------------------------------------------------------------------------
  68. -----------------------------------------------------------------------------*/
  69.  
  70. int SetTransform (T,...)
  71.     TRANSFORM *T;
  72. {
  73.     InitTransform (T);
  74.     return vAppendTransform (T,(&T) + 1);
  75. }
  76.  
  77. /*-----------------------------------------------------------------------------
  78. -----------------------------------------------------------------------------*/
  79.  
  80. void InitTransform (T)
  81.     TRANSFORM *T;
  82. {
  83.     T->T    = Identity4D();
  84.     T->Tinv = Identity4D();
  85. }
  86.  
  87. /*-----------------------------------------------------------------------------
  88. -----------------------------------------------------------------------------*/
  89.  
  90. void ComposeTransform (T,T1)
  91.     TRANSFORM *T;
  92.     TRANSFORM *T1;
  93. {
  94.     /*
  95.      *    T *= T1
  96.      */
  97.  
  98.     T->T    = TxT4D (&T->T,&T1->T);
  99.     T->Tinv = TxT4D (&T1->Tinv,&T->Tinv);
  100. }
  101.  
  102. void PreposeTransform (T,T1)
  103.     TRANSFORM *T;
  104.     TRANSFORM *T1;
  105. {
  106.     /*
  107.      *    T *= T1 * T
  108.      */
  109.  
  110.     T->T    = TxT4D (&T1->T,&T->T);
  111.     T->Tinv = TxT4D (&T->Tinv,&T1->Tinv);
  112. }
  113.  
  114.  
  115.  
  116. /*-----------------------------------------------------------------------------
  117. -----------------------------------------------------------------------------*/
  118.  
  119. int vAppendTransform (TRANSFORM *T,void *arg)
  120. {
  121.   FIXED4D x,y,z;
  122.   MATRIXFX Temp;
  123.   int op;
  124.  
  125.   while (*(int*)arg != END) {
  126.     switch (op = *((int*)arg)++) {
  127.       case SCALE:
  128.       case SCALE4D:
  129.     x = *((FIXED4D *)arg)++; y = *((FIXED4D *)arg)++; z = *((FIXED4D *)arg)++;
  130. #if 0    
  131.     if (fDebug) {
  132.         printf ("SCALE ");
  133.         PrintFx(x);
  134.         PrintFx(y);
  135.         PrintFx(z);
  136.         printf("\n");
  137.         }
  138. #endif        
  139.     Temp = Scale4D(CreatePoint4D(x,y,z,ONE));
  140.         T->T = TxT4D(&T->T,&Temp);
  141. #ifdef INVERSE
  142.     Temp = Scale4D(CreatePoint4D (FXDIV(ONE,x),FXDIV(ONE,y),FXDIV(ONE,z),ONE));
  143.         T->Tinv = TxT4D(&Temp,&T->Tinv);
  144. #endif
  145.     if (op==SCALE4D) *((FIXED4D *)arg)++;
  146.         break;
  147.  
  148.       case TRANSLATE:
  149.       case TRANSLATE4D:
  150.     x = *((FIXED4D *)arg)++; y = *((FIXED4D *)arg)++; z = *((FIXED4D *)arg)++;
  151. #if 0    
  152.     if (fDebug) {
  153.         printf ("TRANSLATE ");
  154.         PrintFx(x);
  155.         PrintFx(y);
  156.         PrintFx(z);
  157.         printf("\n");
  158.         }
  159. #endif        
  160.         Temp = Translate4D(CreateVector4D(x,y,z));
  161.         T->T = TxT4D(&T->T,&Temp);
  162. #ifdef INVERSE
  163.         Temp = Translate4D(CreateVector4D(-x,-y,-z));
  164.     T->Tinv = TxT4D(&Temp,&T->Tinv);
  165. #endif
  166.     if (op==TRANSLATE4D) *((FIXED4D *)arg)++;
  167.     break;
  168.  
  169.       case ROTATEX:
  170.     x = *((FIXED4D *)arg)++;
  171. #if 0    
  172.     if (fDebug) {
  173.         printf ("ROTATEX ");
  174.         PrintFx(x);
  175.         printf("\n");
  176.         }
  177. #endif        
  178.     Temp = RotateX(x);
  179.         T->T = TxT4D(&T->T,&Temp);
  180. #ifdef INVERSE
  181.     Temp = RotateX(-x);
  182.     T->Tinv = TxT4D(&Temp,&T->Tinv);
  183. #endif
  184.         break;
  185.  
  186.       case ROTATEY:
  187.     x = *((FIXED4D *)arg)++;
  188. #if 0    
  189.     if (fDebug) {
  190.         printf ("ROTATEY ");
  191.         PrintFx(x);
  192.         printf("\n");
  193.         }
  194. #endif        
  195.     Temp = RotateY(x);
  196.         T->T = TxT4D(&T->T,&Temp);
  197. #ifdef INVERSE
  198.     Temp = RotateY(-x);
  199.     T->Tinv = TxT4D(&Temp,&T->Tinv);
  200. #endif
  201.         break;
  202.  
  203.       case ROTATEZ:
  204.     x = *((FIXED4D *)arg)++;
  205. #if 0    
  206.     if (fDebug) {
  207.         printf ("ROTATEZ ");
  208.         PrintFx(x);
  209.         printf("\n");
  210.         }
  211. #endif        
  212.     Temp = RotateZ(x);
  213.         T->T = TxT4D(&T->T,&Temp);
  214. #ifdef INVERSE
  215.     Temp = RotateZ(-x);
  216.     T->Tinv = TxT4D(&Temp,&T->Tinv);
  217. #endif
  218.         break;
  219.  
  220.       case PROJECT4D:
  221.       case PROJECT:
  222.     Temp.T[0][0] = *((FIXED4D *)arg)++;
  223.     Temp.T[0][1] = *((FIXED4D *)arg)++;
  224.     Temp.T[0][2] = *((FIXED4D *)arg)++;
  225.     Temp.T[0][3] = FX(0);
  226.     if (op==PROJECT4D)  ((FIXED4D *)arg)++;
  227.  
  228.     Temp.T[1][0] = *((FIXED4D *)arg)++;
  229.     Temp.T[1][1] = *((FIXED4D *)arg)++;
  230.     Temp.T[1][2] = *((FIXED4D *)arg)++;
  231.     Temp.T[1][3] = FX(0);
  232.     if (op==PROJECT4D)  ((FIXED4D *)arg)++;
  233.  
  234.     Temp.T[2][0] = *((FIXED4D *)arg)++;
  235.     Temp.T[2][1] = *((FIXED4D *)arg)++;
  236.     Temp.T[2][2] = *((FIXED4D *)arg)++;
  237.     Temp.T[2][3] = FX(0);
  238.     if (op==PROJECT4D)  ((FIXED4D *)arg)++;
  239.  
  240.     Temp.T[3][0] = FX(0);
  241.     Temp.T[3][1] = FX(0);
  242.     Temp.T[3][2] = FX(0);
  243.     Temp.T[3][3] = FX(1);
  244.  
  245.         T->T = TxT4D(&T->T,&Temp);
  246. #ifdef INVERSE
  247.     Temp = Transpose4D(Temp);
  248.     T->Tinv = TxT4D(&Temp,&T->Tinv);
  249. #endif
  250.         break;
  251.  
  252.  
  253.       default:
  254.         return 0;
  255.     }
  256.   }
  257.   return 1;
  258. }
  259.